/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.jpa.controllers;

import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.ces4.produccion.jpa.entities.Usuario;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import java.util.ArrayList;
import java.util.List;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccionPK;
import java.util.Date;
import javax.persistence.TemporalType;

/**
 *
 * @author usuario
 */
public class SolicitudProduccionJpaController implements Serializable {

    public SolicitudProduccionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public SolicitudProduccion create(SolicitudProduccion solicitudProduccion) {
        if (solicitudProduccion.getOrdenProduccionList() == null) {
            solicitudProduccion.setOrdenProduccionList(new ArrayList<OrdenProduccion>());
        }

        List<DetalleSolicitudProduccion> saveDetalleSolicitudProduccionList = solicitudProduccion.getDetalleSolicitudProduccionList();

        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            solicitudProduccion.setDetalleSolicitudProduccionList(new ArrayList<DetalleSolicitudProduccion>());
            em.persist(solicitudProduccion);
            em.getTransaction().commit();


            for (DetalleSolicitudProduccion DetalleSolicitudProduccionToSave : solicitudProduccion.getDetalleSolicitudProduccionList()) {
                DetalleSolicitudProduccionToSave.setDetalleSolicitudProduccionPK(new DetalleSolicitudProduccionPK(solicitudProduccion.getNmid(), DetalleSolicitudProduccionToSave.getArticulo().getDsid()));
            }
            solicitudProduccion.setDetalleSolicitudProduccionList(saveDetalleSolicitudProduccionList);

            return solicitudProduccion;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(SolicitudProduccion solicitudProduccion) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            SolicitudProduccion persistentSolicitudProduccion = em.find(SolicitudProduccion.class, solicitudProduccion.getNmid());
            Usuario dsusuarioOld = persistentSolicitudProduccion.getDsusuario();
            Usuario dsusuarioNew = solicitudProduccion.getDsusuario();
            List<OrdenProduccion> ordenProduccionListOld = persistentSolicitudProduccion.getOrdenProduccionList();
            List<OrdenProduccion> ordenProduccionListNew = solicitudProduccion.getOrdenProduccionList();
            List<DetalleSolicitudProduccion> detalleSolicitudProduccionListOld = persistentSolicitudProduccion.getDetalleSolicitudProduccionList();
            List<DetalleSolicitudProduccion> detalleSolicitudProduccionListNew = solicitudProduccion.getDetalleSolicitudProduccionList();
            List<String> illegalOrphanMessages = null;
            for (OrdenProduccion ordenProduccionListOldOrdenProduccion : ordenProduccionListOld) {
                if (!ordenProduccionListNew.contains(ordenProduccionListOldOrdenProduccion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain OrdenProduccion " + ordenProduccionListOldOrdenProduccion + " since its solicitudProduccion field is not nullable.");
                }
            }
            for (DetalleSolicitudProduccion detalleSolicitudProduccionListOldDetalleSolicitudProduccion : detalleSolicitudProduccionListOld) {
                if (!detalleSolicitudProduccionListNew.contains(detalleSolicitudProduccionListOldDetalleSolicitudProduccion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain DetalleSolicitudProduccion " + detalleSolicitudProduccionListOldDetalleSolicitudProduccion + " since its solicitudProduccion field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (dsusuarioNew != null) {
                dsusuarioNew = em.getReference(dsusuarioNew.getClass(), dsusuarioNew.getDsid());
                solicitudProduccion.setDsusuario(dsusuarioNew);
            }
            List<OrdenProduccion> attachedOrdenProduccionListNew = new ArrayList<OrdenProduccion>();
            for (OrdenProduccion ordenProduccionListNewOrdenProduccionToAttach : ordenProduccionListNew) {
                ordenProduccionListNewOrdenProduccionToAttach = em.getReference(ordenProduccionListNewOrdenProduccionToAttach.getClass(), ordenProduccionListNewOrdenProduccionToAttach.getOrdenProduccionPK());
                attachedOrdenProduccionListNew.add(ordenProduccionListNewOrdenProduccionToAttach);
            }
            ordenProduccionListNew = attachedOrdenProduccionListNew;
            solicitudProduccion.setOrdenProduccionList(ordenProduccionListNew);
            List<DetalleSolicitudProduccion> attachedDetalleSolicitudProduccionListNew = new ArrayList<DetalleSolicitudProduccion>();
            for (DetalleSolicitudProduccion detalleSolicitudProduccionListNewDetalleSolicitudProduccionToAttach : detalleSolicitudProduccionListNew) {
                detalleSolicitudProduccionListNewDetalleSolicitudProduccionToAttach = em.getReference(detalleSolicitudProduccionListNewDetalleSolicitudProduccionToAttach.getClass(), detalleSolicitudProduccionListNewDetalleSolicitudProduccionToAttach.getDetalleSolicitudProduccionPK());
                attachedDetalleSolicitudProduccionListNew.add(detalleSolicitudProduccionListNewDetalleSolicitudProduccionToAttach);
            }
            detalleSolicitudProduccionListNew = attachedDetalleSolicitudProduccionListNew;
            solicitudProduccion.setDetalleSolicitudProduccionList(detalleSolicitudProduccionListNew);
            solicitudProduccion = em.merge(solicitudProduccion);
            if (dsusuarioOld != null && !dsusuarioOld.equals(dsusuarioNew)) {
                dsusuarioOld.getSolicitudProduccionList().remove(solicitudProduccion);
                dsusuarioOld = em.merge(dsusuarioOld);
            }
            if (dsusuarioNew != null && !dsusuarioNew.equals(dsusuarioOld)) {
                dsusuarioNew.getSolicitudProduccionList().add(solicitudProduccion);
                dsusuarioNew = em.merge(dsusuarioNew);
            }
            for (OrdenProduccion ordenProduccionListNewOrdenProduccion : ordenProduccionListNew) {
                if (!ordenProduccionListOld.contains(ordenProduccionListNewOrdenProduccion)) {
                    SolicitudProduccion oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion = ordenProduccionListNewOrdenProduccion.getSolicitudProduccion();
                    ordenProduccionListNewOrdenProduccion.setSolicitudProduccion(solicitudProduccion);
                    ordenProduccionListNewOrdenProduccion = em.merge(ordenProduccionListNewOrdenProduccion);
                    if (oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion != null && !oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion.equals(solicitudProduccion)) {
                        oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion.getOrdenProduccionList().remove(ordenProduccionListNewOrdenProduccion);
                        oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion = em.merge(oldSolicitudProduccionOfOrdenProduccionListNewOrdenProduccion);
                    }
                }
            }
            for (DetalleSolicitudProduccion detalleSolicitudProduccionListNewDetalleSolicitudProduccion : detalleSolicitudProduccionListNew) {
                if (!detalleSolicitudProduccionListOld.contains(detalleSolicitudProduccionListNewDetalleSolicitudProduccion)) {
                    SolicitudProduccion oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion = detalleSolicitudProduccionListNewDetalleSolicitudProduccion.getSolicitudProduccion();
                    detalleSolicitudProduccionListNewDetalleSolicitudProduccion.setSolicitudProduccion(solicitudProduccion);
                    detalleSolicitudProduccionListNewDetalleSolicitudProduccion = em.merge(detalleSolicitudProduccionListNewDetalleSolicitudProduccion);
                    if (oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion != null && !oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion.equals(solicitudProduccion)) {
                        oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion.getDetalleSolicitudProduccionList().remove(detalleSolicitudProduccionListNewDetalleSolicitudProduccion);
                        oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion = em.merge(oldSolicitudProduccionOfDetalleSolicitudProduccionListNewDetalleSolicitudProduccion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = solicitudProduccion.getNmid();
                if (findSolicitudProduccion(id) == null) {
                    throw new NonexistentEntityException("The solicitudProduccion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            SolicitudProduccion solicitudProduccion;
            try {
                solicitudProduccion = em.getReference(SolicitudProduccion.class, id);
                solicitudProduccion.getNmid();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The solicitudProduccion with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<OrdenProduccion> ordenProduccionListOrphanCheck = solicitudProduccion.getOrdenProduccionList();
            for (OrdenProduccion ordenProduccionListOrphanCheckOrdenProduccion : ordenProduccionListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This SolicitudProduccion (" + solicitudProduccion + ") cannot be destroyed since the OrdenProduccion " + ordenProduccionListOrphanCheckOrdenProduccion + " in its ordenProduccionList field has a non-nullable solicitudProduccion field.");
            }
            List<DetalleSolicitudProduccion> detalleSolicitudProduccionListOrphanCheck = solicitudProduccion.getDetalleSolicitudProduccionList();
            for (DetalleSolicitudProduccion detalleSolicitudProduccionListOrphanCheckDetalleSolicitudProduccion : detalleSolicitudProduccionListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This SolicitudProduccion (" + solicitudProduccion + ") cannot be destroyed since the DetalleSolicitudProduccion " + detalleSolicitudProduccionListOrphanCheckDetalleSolicitudProduccion + " in its detalleSolicitudProduccionList field has a non-nullable solicitudProduccion field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Usuario dsusuario = solicitudProduccion.getDsusuario();
            if (dsusuario != null) {
                dsusuario.getSolicitudProduccionList().remove(solicitudProduccion);
                dsusuario = em.merge(dsusuario);
            }
            em.remove(solicitudProduccion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<SolicitudProduccion> findSolicitudProduccionEntities() {
        return findSolicitudProduccionEntities(true, -1, -1);
    }

    public List<SolicitudProduccion> findSolicitudProduccionEntities(int maxResults, int firstResult) {
        return findSolicitudProduccionEntities(false, maxResults, firstResult);
    }

    private List<SolicitudProduccion> findSolicitudProduccionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(SolicitudProduccion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public SolicitudProduccion findSolicitudProduccion(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(SolicitudProduccion.class, id);
        } finally {
            em.close();
        }
    }

    public List<SolicitudProduccion> getSolicitudProduccionList(Date fechaInicio, Date fechaFin) {
        EntityManager em = getEntityManager();
        try {
            StringBuilder sb = new StringBuilder("SELECT solicitudP FROM SolicitudProduccion solicitudP WHERE 1=1 ");
            if (fechaInicio != null && fechaFin != null) {
                sb.append("AND (solicitudP.fefechaSolicitud BETWEEN :fechaInicio AND :fechaFin)");
            }

            Query query = em.createQuery(sb.toString());
            if (fechaInicio != null) {
                query.setParameter("fechaInicio", fechaInicio, TemporalType.DATE);
            }
            if (fechaFin != null) {
                query.setParameter("fechaFin", fechaFin, TemporalType.DATE);
            }

            List<SolicitudProduccion> solicitudes = query.getResultList();
            return solicitudes;

        } finally {
            em.close();
        }
    }

    public int getSolicitudProduccionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<SolicitudProduccion> rt = cq.from(SolicitudProduccion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
